Atomとtextlintで始めるその場で文章校正ができる環境の作り方
こんにちは。サービスグループの武田です。
AWS re:Invent 2017が開催されますね。弊社からは実に34人が現地に乗り込みます。
AWS re:Invent 2017、クラスメソッドは34人が現地参加!そして全社員でイベントを盛り上げます! #reinvent
今年はお留守番ですが、来年は行きたいと今から狙っています。
さて、弊社はブログの執筆を仕事の一環としてとらえており、毎日たくさんの記事が公開されています。
記事を書く際には、内容はもとより、誤字脱字・表記ゆれにも気を付ける必要があります。
今回は文章のチェック・校正を楽にするためのツールとして、以前から気になっていたtextlintを使ってみましたので紹介します。
もちろんこの記事も、textlintを使って書いています。
環境
$ atom -v Atom : 1.22.1 Electron: 1.6.15 Chrome : 56.0.2924.87 Node : 7.4.0 $ node -v v6.11.4
textlintとは
今回使用するtextlintとは何か、を簡単に説明すると、日本語などの自然言語で書かれた文章の文法チェックを行ってくれるツールです。
プログラミングの世界では、C言語やJavaScriptなどのプログラミング言語で書かれたソースコードの、文法チェックを行うツールが普及していました。lintあるいはlinterと呼ばれ、ただ動くだけではなく、きれいなソースコードを書くのに一役買っていました。
それと同じように、自然言語で書かれた文章のチェックをできるようにしたものがtextlintです。
textlintの特徴として、チェックルールをプラグイン形式で追加したり、あるいは自分で作るなど柔軟にルールを作ることができます。
textlintはそれ単体でも非常に有用なツールですが、Atomにはtextlintと連携するプラグインが開発されています。それを利用するとエディタ上でエラー内容などが確認できます。
textlintのセットアップ
まずはAtom抜きで、textlint単体で動作するところまで準備を進めていきます。
textlintはNode上で動作するため、Nodeの実行環境がない人は先にそちらを完了させましょう。 (Nodeのインストールについては、ESLintのセットアップなどを参考にしてみてください)
初めに作業用のディレクトリを作成し、そこにpackage.json
を用意します。package.json
はNode用の定義ファイルで、プロジェクトで利用するモジュールなどを管理できます。とりあえず試すだけであれば必ずしも必要なファイルではありませんが、用意しておけば、次回からはnpm install
とするだけで必要なモジュールがインストールできます。
テキストエディタで用意することもできますが、次のようにnpm init
コマンドで生成することもできます。npm init
コマンドを実行すると対話形式で項目を聞かれます。基本的にはすべてデフォルトエンターで問題ありません。
$ mkdir /path/to/working_dir && cd $_ $ npm init This utility will walk you through creating a package.json file. It only covers the most common items, and tries to guess sensible defaults. See `npm help json` for definitive documentation on these fields and exactly what they do. Use `npm install <pkg> --save` afterwards to install a package and save it as a dependency in the package.json file. Press ^C at any time to quit. name: (working_dir) version: (1.0.0) description: entry point: (index.js) test command: git repository: keywords: author: license: (ISC) About to write to /path/to/working_dir/package.json: { "name": "working_dir", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC" } Is this ok? (yes) yes
package.json
が作られたら、次にtextlintなどをインストールします。
$ npm install --save-dev prh textlint textlint-rule-preset-ja-technical-writing textlint-rule-prh textlint-rule-spellcheck-tech-word
textlint
が本体で、textlint-rule-*
が使用されるルールです。ほかにも多数のルールが公開されているので、探してみてください。
prh
はあらかじめ用意した辞書を元に、文章の誤植や表記ゆれをチェックするツールです。このprh
をtextlintから使えるようにしたのがtextlint-rule-prh
ということになります。
textlintで使用するルールの指定
インストールが完了したら、次は文章をチェックするルールを指定します。
プロジェクトルートに.textlintrc
という名前でルールファイルを用意すると、コマンド実行時に自動で読み込まれます。ほかにもコマンド実行時にルールを指定することや、ルールファイルを明示的に指定することもできます。
サポートされる形式はYAML、JSON、JSの3種類です。今回は、JSON形式のサンプルが多かったためJSON形式で用意してみます。
{ "rules": { "preset-ja-technical-writing": { "no-exclamation-question-mark": false }, "spellcheck-tech-word": true, "prh": { "rulePaths": [ "node_modules/prh/prh-rules/media/techbooster.yml", "node_modules/prh/prh-rules/media/WEB+DB_PRESS.yml" ] } } }
preset-ja-technical-writing
は技術文書向けのプリセットとなっており、とりあえずガバッとルールを適用できるため便利です。詳細はルール一覧にまとまっています。デフォルト値はやや厳しめの設定となっているようで、用途に合わせて少し緩めることもできます(上記の設定では、感嘆符を使えるようにしています)。
spellcheck-tech-word
とprh.rulePaths
はそれぞれ辞書を有効にしており、これによって文章内に出てきた技術用語などがチェックされます。
今回はprhモジュールに同梱されているtechbooster.yml
とWEB+DB_PRESS.yml
を使用してみます。
実際にチェックしてみる
それでは用意したルールを使って文章をチェックしてみましょう。今回は次の文章をサンプルとします。
今週はみんなre:inventに行っているためオフィスがガランとしている。 帰ってきたらJAVAとjavascriptの違いを聞こうと思う。。
textlint
コマンドは.node_modules
配下にあるためそれを使います。
$ ./node_modules/.bin/textlint sample.txt /path/to/working_dir/sample.txt 3:12 ✓ error javascript => JavaScript prh 3:30 error 弱い表現: "思う" が使われています。 preset-ja-technical-writing/ja-no-weak-phrase 3:33 error "。" が連続して2回使われています。 preset-ja-technical-writing/ja-no-successive-word ✕ 3 problems (3 errors, 0 warnings) ✓ 1 fixable problem. Try to run: $ textlint --fix [file]
ちゃんとチェックされてますね。
辞書を追加してみる
先ほど用意した文章ですが、指摘されていない誤植が2つあります。ひとつはre:invent
、もうひとつはJAVA
です。辞書にない用語は指摘されませんので、これらが指摘されるように自分で辞書を追加してみましょう。
dict/tech-word.yml
として次のようなファイルを追加します(書き方はmisc/prh.ymlを参考にしてください)。
version: 1 rules: - expected: Java - expected: re:Invent
そして.textlintrc
に、このファイルが読み込まれるように設定を追加します。
{ "rules": { "preset-ja-technical-writing": { "no-exclamation-question-mark": false }, "spellcheck-tech-word": true, "prh": { "rulePaths": [ "dict/tech-word.yml", "node_modules/prh/prh-rules/media/techbooster.yml", "node_modules/prh/prh-rules/media/WEB+DB_PRESS.yml" ] } } }
それでは再度チェックをしてみましょう。
$ ./node_modules/.bin/textlint sample.txt /path/to/working_dir/sample.txt 1:7 ✓ error re:invent => re:Invent prh 3:7 ✓ error JAVA => Java prh 3:12 ✓ error javascript => JavaScript prh 3:30 error 弱い表現: "思う" が使われています。 preset-ja-technical-writing/ja-no-weak-phrase 3:33 error "。" が連続して2回使われています。 preset-ja-technical-writing/ja-no-successive-word ✕ 5 problems (5 errors, 0 warnings) ✓ 3 fixable problems. Try to run: $ textlint --fix [file]
追加した2つの用語もしっかりと指摘されましたね。
ちなみに、✓マーク が付いているものは、textlint --fix
を実行することで自動修正を行うこともできます。便利。
/// 小技
textlint実行時に、わざわざパスで指定するのは面倒ですね。
実はpackage.json
のscripts
に、実行したいコマンドを指定することでもう少し楽ができます。
{ "name": "working_dir", "version": "1.0.0", "description": "", "main": "index.js", "devDependencies": { "prh": "^5.4.3", "textlint": "^9.1.1", "textlint-rule-preset-ja-technical-writing": "^2.0.0", "textlint-rule-prh": "^5.0.1", "textlint-rule-spellcheck-tech-word": "^5.0.0" }, "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "lint": "textlint" }, "author": "", "license": "ISC" }
次のようなコマンドで実行できます。
$ npm run lint -s sample.txt
/// 小技ここまで
Atomで確認
以上で、textlintの基本的な動作が確認できました。最後にコマンド実行時ではなく、Atom上で確認できるようにしてみましょう。
GUIまたはコマンドでlinter-textlint
をAtomにインストールします。
$ apm install linter-textlint
インストールできたら、先ほどのsample.txt
をAtomで開いてみましょう。
$ atom linter-textlint
ファイルが開けたらエラーのある箇所には赤線が引かれています。マウスオーバーすることで指摘内容が確認できます。
Atom上でエラーが確認できました。ファイル保存時にlintが実行されるため、もしエラーが表示されない場合は、一度上書き保存してみてください。
後は指摘された内容を元に、文章を修正して再チェックを繰り返していくだけで、みるみるうちに文章が良くなっていくはずです。
まとめ
誤字脱字は文章を書くときには注意する必要がありますが、注意していても見逃してしまうことはよくあります。
またブログなど個人で書くものについては表記の統一の重要性は低くなりがちですが、外向けのドキュメントなどを書く際には表記の統一は必要不可欠です。
文章のチェックは往々にしてコストの高い作業であるため、こういったツールをうまく使っていきたいですね。
最後に
今回は少ない手間でtextlintを始められる流れを紹介しましたが、このままでは厳しすぎるルールや、表記ルールのコンフリクトが起こりえます。
実際に文章を書く中で、実態に沿ったルールとなるように調整していってください。
それでは、今回はここまで。